///////////////////////////////////////////////////////////////////-=505-Tech=-///
//电赛H题-模拟电磁曲射炮-PID代码
///////////////////////////////////////////////////////////////////-=505-Tech=-///
//版本：V0.0
//编写：陈济轩
//中国民航大学电子科技创新创业实践基地505创客实验室
///////////////////////////////////////////////////////////////////-=505-Tech=-///
//本程序仅供学习参考，未经许可，不得用于其它任何用途
///////////////////////////////////////////////////////////////////-=505-Tech=-///
#include "PID.h"
///////////////////////////////////////////////////////////////////-=505-Tech=-///
/********************************************************************************
	功能：	PID控制器
	参数：	PID       PID参数结构体
	      set_Aim   目标值
	      now_Aim   当前值
	返回：	控制量
	备注：	参数大于0
*********************************************************************************/
float PID_Controller(MyPID *PID, float set_Aim, float now_Aim)
{
    if(set_Aim != 0)//如果目标为0，则不计算
    {
        PID->err = set_Aim - now_Aim;
			
        PID->PID_Out = PID->Kp *  PID->err
			               + PID->Kd * (PID->err - PID->err_last) 
			               + PID->Ki *  PID->PIDI;
			
        PID->err_last = PID->err;

			if ((PID->err < -PID->KiSec_Inner && PID->err >= -PID->KiSec_Inner-PID->KiSec_Width)
				||(PID->err >  PID->KiSec_Inner && PID->err <=  PID->KiSec_Inner+PID->KiSec_Width)) //在积分带内才进行积分
        {
            PID->PIDI += PID->err;
        }
        else
        {
            PID->PIDI = 0;
        }
    } else
    {
        PID->PIDI = 0;
        PID->err = 0;
        PID->err_last = 0;
        PID->PID_Out = 0;
    }

    return PID->PID_Out;
}
///////////////////////////////////////////////////////////////////-=505-Tech=-///
